3ae85c9388c02647d242cf2ebb07d6cc1cecca8d,src/main/org/codehaus/groovy/transform/AutoCloneASTTransformation.java,AutoCloneASTTransformation,createCloneCopyConstructor,#ClassNode#List#List#,144

Before Change


            String name = fieldNode.getName();
            if (excludes.contains(name)) continue;
            Expression direct = propX(other, name);
            Expression cloned = callX(direct, "clone");
            Expression to = propX(varX("this"), name);
            Statement assignCloned = assignS(to, cloned);
            Statement assignDirect = assignS(to, direct);
            initBody.addStatement(ifElseS(isInstanceOfX(direct, CLONEABLE_TYPE), assignCloned, assignDirect));
        }
        ClassNode[] exceptions = {make(CloneNotSupportedException.class)};
        cNode.addConstructor(ACC_PROTECTED, params(initParam), ClassNode.EMPTY_ARRAY, initBody);

After Change


        for (FieldNode fieldNode : list) {
            String name = fieldNode.getName();
            if (excludes.contains(name)) continue;
            ClassNode fieldType = fieldNode.getType();
            Expression direct = propX(other, name);
            Expression to = propX(varX("this"), name);
            Statement assignDirect = assignS(to, direct);
            Statement assignCloned = assignS(to, castX(fieldType, callX(direct, "clone")));
            Statement assignClonedDynamic = assignS(to, castX(fieldType, callCloneDynamicX(direct)));
            if (isOrImplements(fieldType, CLONEABLE_TYPE)) {
                initBody.addStatement(assignCloned);
            } else if (!possiblyCloneable(fieldType)) {
                initBody.addStatement(assignDirect);
            } else {
                initBody.addStatement(ifElseS(isInstanceOfX(direct, CLONEABLE_TYPE), assignClonedDynamic, assignDirect));
            }
        }
        ClassNode[] exceptions = {make(CloneNotSupportedException.class)};